#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=200050;
const int INF=0x3f3f3f;
int n;
int a[N];
int c[N];
int vis[N];
int ans;
int pp;
int _min;
void dfs(int p){
    //正在栈中访问
    if(vis[p]==1){
        if(pp==p){
            //找到一个环，更新答案
            ans+=_min;
        }
        //这是开始的第一个节点
        else if(pp==-1){
            pp=p;
            _min=c[p];
            dfs(a[p]);
        }
        else{
            //更新环上最小值
            _min=min(_min,c[p]);
            dfs(a[p]);
        }
        //p已访问
        vis[p]=2;
    }
    //开始访问
    else if(vis[p]==0){
        vis[p]=1;
        dfs(a[p]);
        vis[p]=2;
    }
    return;
}
int main(void){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&c[i]);
    }
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            //以i为起点搜索，因此i的前驱节点不存在，为-1
            pp=-1;
            _min=INF;
            dfs(i);
        }
    }
    printf("%d\n",ans);
    return 0;
}